package com.shujia.day15;

public class Code02ThreadOperator2 {
    public static void main(String[] args) {
        /*
            调试Thread中设置优先级的方式

            注意：
                当线程获取到CPU的执行权后，并不是只会执行单次代码，而是获取到CPU的一小段时间片，
                    在这一小段执行时间中可以执行很多次循环代码
         */
//        MyThread2 thread1 = new MyThread2();
//        thread1.setName("张从文");
//        MyThread2 thread2 = new MyThread2();
//        thread2.setName("罗中文");
//
//        thread1.setPriority(10); // 优先级高的先执行，但是并不一定会就是当前线程立即执行，而是概率比较高
//        thread2.setPriority(1);
//
//        thread1.start();
//        thread2.start();

        /*
            线程控制
                线程休眠
                public static void sleep(long millis)  静态方法
                      作用：对当前线程进行做睡眠
                线程加入
                public final void join()
                     作用：当前线程执行完成后，再去执行其他线程 并且需要注意，在线程start之后，再去做join才会生效
                线程礼让
                    public static void yield()
                      作用：通过在运行run方法代码过程中对其他线程进行做礼让，但是并不能达每个线程只打印一次信息
                             原因：1.在获取到CPU执行权一小段时间内，可以执行多次循环
                                  2.对于礼让线程只是退出当前CPU的执行权，后续可以再做线程竞争
                后台线程
                    public final void setDaemon(boolean on)
                    在Java中线程分为两类：
                        1.用户线程
                        2.守护线程（后台线程）
                    setDaemon方法的作用是，当设置当前线程为守护线程，那么用户线程执行完成后，守护线程就直接停止，
                            但不是立即停止，因为CPU的一小段执行时间内，可以执行很多条数据

                中断线程
                    public final void stop()
                        作用：可以通过获取到当前线程对象，对其stop进行调用，调用后立即停止当前线程
                            其中注意 stop方法被@Deprecated 修饰了 那么该方法表示已经过时了

                    public void interrupt()
                         作用：当运行过程中，如果触发了，那么会抛出一个异常，但是程序会继续执行直到其结束
         */

        MyThread2 thread1 = new MyThread2();
        thread1.setName("张从文");
        MyThread2 thread2 = new MyThread2();
        thread2.setName("罗中文");
        MyThread2 thread3 = new MyThread2();
        thread3.setName("李卫国");

//        thread1.start();
//        try {
//            thread1.join();  // 对thread1执行join
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }



        // 设置当前两个线程为后台线程（也成为是一个守护线程）
//        thread1.setDaemon(true);
//        thread2.setDaemon(true);


//        thread1.start();
//        thread2.start();
        thread3.start();


    }

}

class MyThread2 extends Thread {

    @Override
    public void run() {
        for (int i = 1; i <= 300; i++) {
//            try {
//                Thread.sleep(50);
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
            System.out.println(getName() + "当前线程遍历到" + i);
            if (i == 100){
//                Thread.currentThread().stop();
//                interrupt();
            }
//            Thread.yield(); // 礼让其他的进程
        }
    }
}
